package br.com.velp.sudecap.daoimpl;

import br.com.velp.sudecap.dao.ImovelDecretoDAO;
import br.com.velp.sudecap.entidade.ImovelDecreto;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

/**
 * <sumario> <objetivo> "Rastreabilidade" </objetivo> <autor> EDUARDO SANTOS DE
 * OLIVEIRA </autor> <versao>1.0.0.0</versao> <data_criacao> 17.10.2012
 * </data_criacao> <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF006.03 - Relacionar Decretos x Imóveis
 * </requisitos_afetados> <descricao> Implementação da Interface Responsável Pelas Operações de
 * CRUD Referentes ao Contexto de Imóveis </descricao> </sumario>
 */
@Repository("imovelDecretoDAO")
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class ImovelDecretoDAOImpl implements ImovelDecretoDAO {
    
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public Long salvar(ImovelDecreto value) {
	Long id = (Long) getSession().save(value);
	getSession().flush();
	return id;
    }

    @Override
    public void atualizar(ImovelDecreto value) {
	getSession().update(value);
	getSession().flush();
    }

    @Override
    public ImovelDecreto obterPorId(Long id) {
	return (ImovelDecreto) getSession().get(ImovelDecreto.class, id);
    }

    @Override
    public void excluir(ImovelDecreto value) {
	getSession().delete(value);
	getSession().flush();
    }
    
    @Override
    public List<ImovelDecreto> recuperarImoveisDoDecreto(Long idDecreto) {
	Criteria criteria = getSession().createCriteria(ImovelDecreto.class);
	criteria.add(Restrictions.eq("decreto.id", idDecreto));
	criteria.createAlias("decreto", "decreto");
	criteria.createAlias("imovel", "imovel");
	criteria.addOrder(Order.asc("imovel.bairro"));
	return criteria.list();
    }
    
    public Session getSession(){
	return this.sessionFactory.getCurrentSession();
    }
    
}
